#include "RATE.h"

RATE_T* RATE_t;



//************************************
// Method:    	CALCU_SAMA						//< SAMA运算函数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	bool							//< 成功：true；失败：false
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	float dt						//< 运算周期
// Parameter: 	bool * DI						//< 数字量输入值数组指针
// Parameter: 	bool * DO						//< 数字量输出值数组指针
// Parameter: 	bool * AI						//< 模拟量输入值数组指针
// Parameter: 	bool * AO						//< 模拟量输出值数组指针
//************************************
bool CALCU_SAMA(RATE)(Model_Base_t* arg, float dt, bool* DI, bool* DO, float* AI, float* AO)
{
#define FABS(x) (float)fabs(x)
	/****************变量定义区开始**************/
	/*<<<<<定义输入变量>>>>>*/
	float defAI;					//< 模拟量输入
	float AL;						//< 加速限制
	float DL;						//< 减速限制
	
	/*<<<<<定义输出变量>>>>>*/
	float Output_Value =0;				//< 输出值

	/*<<<<<定义参数变量>>>>>*/
	

	/*<<<<<定义中间变量>>>>>*/
	float* Last_AI;					//< 上一时刻模拟量输入
	float* Last_AO;					//< 上一时刻输出

	/****************变量定义区结束**************/

	NAME(RATE)* Obj = (NAME(RATE)*)arg;

	/****************变量赋值**************/
	/*<<<<<输入变量赋值>>>>>*/
	defAI = AI[0];
	AL = AI[1];
	DL = AI[2];

	/*<<<<<参数变量赋值>>>>>*/
	
	/*<<<<<中间变量赋值>>>>>*/
	Last_AI = &(Obj->Sta.Last_AI);
	Last_AO = &(Obj->Sta.Last_AO);

	/**************变量赋值结束************/

	/********************************************/
	/**************算法功能实现开始**************/
	/********************************************/
	/*AL = (float)fabs(AL);
	DL = (float)fabs(DL);*/

	//Output_Value = defAI;
	//if ((defAI - Last_AI[0]) / dt > AL)
	//	Output_Value = Last_AO[0] + AL * dt;				//< 和文档表达式对不上  目前按照TOP、明华程序编程
	//else if ((Last_AI[0] - defAI) / dt > DL)
	//	Output_Value = Last_AO[0] - DL * dt;				//< 和文档表达式对不上  目前按照TOP、明华程序编程
	//else
	//{
	//	if ((defAI - Last_AO[0]) / dt > AL )
	//		Output_Value = Last_AO[0] + AL * dt;
	//	else if ((Last_AO[0] - defAI) / dt > DL )
	//		Output_Value = Last_AO[0] - AL * dt;
	//	else
	//		Output_Value = defAI;
	//}

	/*Output_Value = defAI;												//< duan 191025注释
	if (FABS(defAI - Last_AI[0]) / dt > FABS(AL))
		Output_Value = Last_AO[0] + AL * dt;
	if (FABS(defAI - Last_AI[0]) / dt < FABS(DL))
		Output_Value = Last_AO[0] + DL * dt;*/

	Output_Value = defAI;
	AL = FABS(AL);
	DL = FABS(DL);

	if ((defAI - Last_AI[0]) / dt > AL)
		Output_Value = Last_AO[0] + AL * dt;
	else if ((Last_AI[0] - defAI) / dt > DL)
		Output_Value = Last_AO[0] - DL * dt;
	

	Last_AI[0] = Output_Value;								//< duan 101025修改
	Last_AO[0] = Output_Value;

	/********************************************/
	/**************算法功能实现结束**************/
	/********************************************/	

	/****************运算结果输出**************/
	AO[0] = Output_Value;
	/**************运算结果输出完毕************/
	return true;

#undef FABS(x)
}





//************************************
// Method:    	BAK_STA							//< 备份SAMA运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回打包字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 指定模块类型链表的指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int BAK_STA(RATE)(Model_Base_t* arg, void** Data)
{
	NAME(RATE)* Obj = (NAME(RATE)*)arg;
	BAK_STA_PRIVATE(Obj);
	return 0;
}



//************************************
// Method:    	ANA_STA							//< 解析备份的SAMA运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Returns:   	int								//< 成功：返回解析字节个数；失败：返回0
// Parameter: 	Model_Base_t * arg				//< 模块参数结构体指针
// Parameter: 	void ** Data					//< 存放数据包当前指针位置的地址
//************************************
int ANA_STA(RATE)(Model_Base_t* arg, void** Data)
{
	NAME(RATE)* Obj = (NAME(RATE)*)arg;
	ANA_STA_PRIVATE(Obj);
	return 0;
}


//************************************
// Method:    	INIT_STAPAR						//< 初始化模块运算中间参数
// Programmer:  lww
// Time:		2018/11/16
// Parameter: 	Model_Base_t* arg				//< 模块参数结构体指针
//************************************
void INIT_STAPAR(RATE)(Model_Base_t* arg)
{
	NAME(RATE)* name = (NAME(RATE)*)arg;
	/****************初始化中间变量结构体**************/
	memset(&(name->Sta), 0, sizeof(name->Sta));
	/**************初始化中间变量结构体结束************/

	/****************对中间变量结构体的相关参数进行赋值**************/

	/**************对中间变量结构体的相关参数进行赋值结束************/
}
